#ifndef TIMER_QUEUE_H
#define TIMER_QUEUE_H

#include <set>

#include "./Timer.h"

namespace Timer
{
    class TimerQueue
    {
    public:
        TimerQueue();
        ~TimerQueue();

        using Timestamp = std::chrono::system_clock::time_point;
        using TimeInterval = std::chrono::duration<double>;
        using TimerCallback = std::function<void()>;
        void addTimer(Timestamp timeout, TimeInterval interval, const TimerCallback &cb);

        int getTimerFd() const
        {
            return this->timerFd_;
        }
        void handleTimers();

    private:
        // TODO: 使用std::unique_ptr<>
        // 使用原始指针的一个可能好处是：每次操作都记得处理两个成员：1.timerFd_ 2.timers_
        using TimerEntry = std::pair<Timestamp, Timer *>; // 时间戳-定时器
        using TimerSet = std::set<TimerEntry>;            // 红黑树按照时间戳从小到大排序

        bool insertTimer(Timer *timer);
        void resetTimerfd(int timerFd, Timestamp timeout);

        std::vector<TimerEntry> getTimeoutTimers(Timestamp now);
        void resetTimeoutTimers(const std::vector<TimerEntry> &timeoutTimers, Timestamp now);

        TimerSet timers_;
        int timerFd_;
    };
} // namespace Timer

#endif // TIMER_QUEUE_H